package controller;

import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Set;

import dao.ClienteDAO;
import dao.ProdutoDAO;
import model.Produto;

/**
 * Classe que realiza a conexão do usuário com o DAO (o HashMap de Produtos)
 * com métodos de inclusão, atualização, exclusão e exibição.
 * 
 * @author Pedro
 * @author Dayane
 * 
 */

public class ProdutoController {

	static Scanner sc = new Scanner(System.in);

	public static Produto toInclude() {

		Produto produto = new Produto();
		try {
			System.out.println("Nome:");
			produto.setNome(sc.nextLine());
			
			System.out.println("Preco:");
			produto.setPreco(sc.nextDouble());
			sc.nextLine();

			do{
				System.out.println("Codigo:");
				produto.setKey(sc.nextInt());
				sc.nextLine();
				if(produto.getKey() == 0){
					System.err.println("O codigo do produto tem que ser diferente de 0");
				}
			}while(produto.getKey() == 0);
			
			return produto;
		} catch (InputMismatchException e) {
			System.err.println("Valor inserido invalido. Insira novamente");
			sc.nextLine();

			// Usando phoenix exception para resolver esse problema.
			return ProdutoController.toInclude();
		}
	}

	public static Produto toDelete(HashMap<Integer, Produto> produtoList) {
		System.out.println("Codigo do produto a excluir:");
		int key = ProdutoController.askKey();		
		Produto produto = ProdutoDAO.loadByKey(produtoList, key);
		if (!(produto == null)) {
			System.out.println("Tem certeza que deseja excluir o produto abaixo? (S/N)");
			produto.imprimir();
			do{
				try{
					if(sc.next().equalsIgnoreCase("n")) {
						produto = null; // zera cliente a ser retornado para que nao seja apagado.
						sc.nextLine();
						break;
					}
					if(sc.next().equalsIgnoreCase("s")){
						System.out.println(ClienteDAO.getMsg());
						sc.nextLine();
						break;
					} 
				} catch (InputMismatchException e) {
					System.err.println("Valor invalido: \nDigite um valor valido");
					sc.nextLine();
				}
			}while(true);

		}else{
			System.err.println("Produto inexistente.");
		}
		return produto;
	}

	public static Produto toUpdate(Produto p) {
		System.out.println("Produto atual: ");
		p.imprimir();
		do{
			try {
				System.out.println("Alterar nome? (S/N)");
				if (sc.next().equalsIgnoreCase("s")) {
					sc.nextLine();
					System.out.println("Digite o novo nome:");
					p.setNome(sc.next());
					sc.nextLine();
					break;
				}
				if (sc.next().equalsIgnoreCase("n")){
					sc.nextLine();
					break;
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		}while(true);

		do{
			try {
				System.out.println("Alterar preco? (S/N)");
				if (sc.next().equalsIgnoreCase("s")) {
					sc.nextLine();
					System.out.println("Digite o novo preco:");
					p.setPreco(sc.nextDouble());
					sc.nextLine();
					break;
				}
				if (sc.next().equalsIgnoreCase("n")){
					sc.nextLine();
					break;
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		}while(true);
		
			return p;
	}

	public static void imprimir(HashMap<Integer, Produto> produtos) {
		Set<Integer> a = produtos.keySet();
		
		System.out
		.println("_____________________________________________________________________________");
		for (int y : a) {
			System.out.println("Codigo: " + produtos.get(y).getKey());
			System.out.println("Nome: " + produtos.get(y).getNome());
			System.out.println("Preco: " + produtos.get(y).getPreco());
			System.out
					.println("_____________________________________________________________________________");
		}

	}

	/**
	 * Pedir para usuario inserir uma chave via teclado.
	 * 
	 * @return int
	 */
	public static int askKey() {
		System.out.println("Insira a chave do produto desejado:");
		try {
			int key = sc.nextInt();
			sc.nextLine();
			return key;
		} catch (InputMismatchException e) {
			System.err.println("Valor inserido invalido. Insira novamente");
			sc.nextLine();

			// Usando phoenix exception para resolver esse problema.
			return ProdutoController.askKey();
		}
	}
}
